package com.guducat.collegeWeb.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.util.SaResult;
import com.guducat.collegeWeb.dto.request.ArticleEditDTO;
import com.guducat.collegeWeb.dto.response.ArticleDetailDTO;
import com.guducat.collegeWeb.dto.response.ArticleListDTO;
import com.guducat.collegeWeb.dto.response.PageResultDTO;
import com.guducat.collegeWeb.service.ArticleService;
import com.guducat.collegeWeb.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 管理员控制器
 */
@RestController
@RequestMapping("/api/admin")
@Tag(name = "管理员功能", description = "提供管理员专用的文章管理、权限检查等功能，需要Admin权限")
public class AdminController {

    private final UserService userService;
    private final ArticleService articleService;

    @Autowired
    public AdminController(UserService userService, ArticleService articleService) {
        this.userService = userService;
        this.articleService = articleService;
    }

    /**
     * 检查是否有管理员权限
     * @return 是否有管理员权限
     */
    @Operation(
        summary = "检查管理员权限",
        description = "检查当前登录用户是否拥有管理员权限，需要先登录且具有Admin权限",
        security = { @SecurityRequirement(name = "satoken") }
    )
    @ApiResponses({
        @ApiResponse(responseCode = "200", description = "有管理员权限",
            content = @Content(mediaType = "application/json",
            schema = @Schema(implementation = SaResult.class))),
        @ApiResponse(responseCode = "401", description = "未登录"),
        @ApiResponse(responseCode = "403", description = "无管理员权限")
    })
    @GetMapping("/check")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult checkAdminPermission() {
        return SaResult.ok("有管理员权限");
    }

    /**
     * 获取文章详情（用于编辑）
     * 返回文章的所有信息供编辑，包括news_id, category, title, pub_time, content_html, content_text, url, crawl_time字段
     * @param newsId 文章ID
     * @return 文章详情
     */
    @GetMapping("/article/{newsId}")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult getArticleDetail(@PathVariable Integer newsId) {
        try {
            // 使用管理员专用的获取文章详情方法，包含更多字段
            ArticleDetailDTO article = articleService.adminGetArticleDetail(newsId);
            return SaResult.data(article);
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }

    /**
     * 更新文章
     * 可更新category, title, pub_time, content_html, content_text, url字段
     * crawl_time会自动更新为当前时间
     * @param newsId 文章ID
     * @param articleEditDTO 文章编辑信息
     * @return 更新结果
     */
    @PutMapping("/article/{newsId}")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult updateArticle(@PathVariable Integer newsId, @RequestBody ArticleEditDTO articleEditDTO) {
        try {
            // 使用管理员专用的更新文章方法，可更新更多字段
            articleService.adminUpdateArticle(newsId, articleEditDTO);
            return SaResult.ok("更新成功");
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }

    /**
     * 创建文章
     * 可设置news_id, category, title, pub_time, content_html, content_text, url字段
     * 如果未提供news_id，则自动生成一个唯一的ID
     * crawl_time会自动设置为当前时间
     * @param articleEditDTO 文章编辑信息
     * @return 创建结果（包含新创建的文章ID）
     */
    @Operation(
        summary = "创建新文章",
        description = "创建一篇新文章，可设置news_id, category, title, pub_time, content_html, content_text, url字段。" +
                "如果未提供news_id，则自动生成一个唯一的ID。crawl_time会自动设置为当前时间。",
        security = { @SecurityRequirement(name = "satoken") }
    )
    @ApiResponses({
        @ApiResponse(responseCode = "200", description = "文章创建成功",
            content = @Content(mediaType = "application/json",
            schema = @Schema(implementation = SaResult.class))),
        @ApiResponse(responseCode = "401", description = "未登录或无权限"),
        @ApiResponse(responseCode = "400", description = "请求参数错误")
    })
    @PostMapping("/article/new")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult createArticle(
            @io.swagger.v3.oas.annotations.parameters.RequestBody(
                description = "文章编辑信息",
                required = true,
                content = @Content(schema = @Schema(implementation = ArticleEditDTO.class))
            )
            @RequestBody ArticleEditDTO articleEditDTO) {
        try {
            // 使用管理员专用的创建文章方法，可设置更多字段
            Integer newsId = articleService.adminCreateArticle(articleEditDTO);

            // 构建返回结果，包含文章ID
            Map<String, Object> result = new HashMap<>();
            result.put("news_id", newsId);
            result.put("message", "文章创建成功");

            return SaResult.data(result);
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }

    /**
     * 删除文章
     * @param newsId 文章ID
     * @return 删除结果
     */
    @DeleteMapping("/article/{newsId}")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult deleteArticle(@PathVariable Integer newsId) {
        try {
            articleService.deleteArticle(newsId);
            return SaResult.ok("删除成功");
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }

    /**
     * 获取文章列表（分页）
     * @param pageNum 页码（从1开始）
     * @param pageSize 每页记录数
     * @return 文章列表
     */
    @GetMapping("/articles")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult getArticleList(
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "10") int pageSize) {
        try {
            PageResultDTO<ArticleListDTO> result = articleService.getLatestArticles(pageNum, pageSize);
            return SaResult.data(result);
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }

    /**
     * 搜索文章（管理员专用）
     * @param keyword 搜索关键词
     * @param pageNum 页码（从1开始）
     * @param pageSize 每页记录数
     * @return 搜索结果
     */
    @GetMapping("/articles/search")
    @SaCheckLogin
    @SaCheckPermission("Admin")
    public SaResult searchArticles(
            @RequestParam String keyword,
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "10") int pageSize) {
        try {
            PageResultDTO<ArticleListDTO> result = articleService.searchArticlesByKeyword(keyword, pageNum, pageSize);
            return SaResult.data(result);
        } catch (Exception e) {
            return SaResult.error(e.getMessage());
        }
    }
}
